iT邦幫忙

2023 iThome 鐵人賽

DAY 15
0
自我挑戰組

轉職仔與JavaScript的初次相遇系列 第 15

JavaScript Hoisting (提昇)和TDZ(暫時性死區) - Day15

  • 分享至 

  • xImage
  •  

前言

今天我們將講解JavaScript Hoisting以及TDZ(暫時性死區),

說明

Hoisting(提昇):

什麼是Hoisting呢?
https://ithelp.ithome.com.tw/upload/images/20230922/20162465nd9edmYVpd.jpg

中文意思:抬起,吊起

在JavaScript中,Hoisting指的是一種執行程式碼前,將declaration移動到最上方的行為
那在JavaScript中主要有兩種declaration

  1. Function
  2. Variable

讓我們看以下Function declartion例子:

Name(); // Jeremy

function Name(){
    console.log('Jeremy')
}

在上述例子中,由於JavaScript引擎的Hoisting行為,使得Name函式在尚未定義前,即可使用

接下來看Variable declaration例子:
在舉例前,必須先講解Variable declaration的兩種階段:
Declaration phase(宣告階段)以及Initialization phase(初始化階段)

Declaration phase:變數會被宣告,而Hoisting也只提昇『宣告』
Initialization phase: 變數賦值

此外對於var, const以及let,Hoisting也會有不同作法

  • var variable:hoisting發生時會先給定一個undefined初始值 (在Declaration phase)
  • let和const variable:hoisting並不會給定一個初使值
console.log(x);
var x = 5; //undefined

為什麼結果會是undefined呢?
因為hoisting只提昇了var x,並給定一個undefined作為初始值

console.log(y);
let y = 5 // Uncaught ReferenceError: Cannot access 'y' before initialization

根據上方解釋我們可以得知,其實let和const是有hoisting的,那為何會跳出這樣的Error message呢?

Temporal Dead Zone (TDZ,暫時性死區)

定義:對於使用 let 或 const 宣告的變量,在進入Initialization phase(初始化階段)之前,無法存取或引用它們的值
由於TDZ的設定,才會得到初始化前無法讀取的Error message
TDZ能為有助於避免使用未初始化的變數,這也是為何會不建議使用var來宣告變數!


上一篇
JavaScript的Execution context(執行上下文)- Day14
下一篇
JavaScript的Scope(作用域) - Day16
系列文
轉職仔與JavaScript的初次相遇30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言